package java_thinking.unit_21._21_16;

import net.jcip.annotations.ThreadSafe;

/**
 * @Desc:   16-5 提前初始化 不需要同步
 * @author: cww
 * @DateTime: 2019-06-30 22:01
 */
@ThreadSafe
public class EagerInitialization {
    /**
     * 静态初始化对象都不需要显示的同步
     * 由于 JVM 将在初始化期间获得一个锁，并且每个线程都至少获取一次这个锁以确保这个类已经加载，因此在静态初始化期间，
     * 内存写入操作将自动对所有线程可见。因此无论是在被构造期间还是被引用时，静态初始化的对象都不需要显示的同步
     */
    private static Resource resource = new Resource();

    public static Resource getResource() {
        return resource;
    }

    static class Resource {
    }
}

/**
 * 16-4 基于锁的线程安全延迟初始化
 */
@ThreadSafe
class  SafeLazyInitialization {
    private static Resource resource;

    public synchronized static Resource getInstance() {
        if (resource == null)
            resource = new Resource();
        return resource;
    }

    static class Resource {
    }
}

/**
 * 反例 不要这么做 不安全的发布一个对象
 */
class UnsafeLazyInitialization {
    private static Resource resource;

    /**
     * 但是静态代码块就不同于静态初始化对象了，它必须要被同步
     * @return
     */
    public static Resource getInstance() {
        if (resource == null)
            // unsafe publication
            resource = new Resource();
        return resource;
    }

    static class Resource {
    }
}